<?php
namespace app\wxapp\controller;
use think\Cache;
use think\Config;
use think\Controller;
use think\Request;
use app\common\model\Users;
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018\5\7 0007
 * Time: 9:10
 */
class Wxlogin extends Controller{


    /**
     * 只有登录了才有token 没有登录前端获取不到token
     * @param Request $request
     * @throws
     */
    public function login(Request $request)
    {
        $wx_config = Config::get("weixin");
        $appid = $wx_config['appid'];
        $secret = $wx_config['secret'];

        $code = trim($request->post('code'));
        if (empty($code)) {
            $this->error("非法操作");
        }

        if (empty($appid) || empty($secret)) {
            $this->error("非法操作");
        }

        $get_token_url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $code . '&grant_type=authorization_code';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $get_token_url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        $res = curl_exec($ch);
        curl_close($ch);

        $res = json_decode($res, true);
        $openid = '';
        if ($res && !empty($res['openid'])) {
            $openid = $res['openid'];
        }

        if (empty($openid)) {
            $this->error('登录失败');
        }


        //处理用户数据
        $condition = ['openid'=>$openid];
        $user = Users::where($condition)->find();
        if(!$user){
            $user = new Users;
            $user -> openid = $openid;
            $user -> add_time = time();
            $user -> save();
        }

        //openid肯定不能返回   返回一个经过加密的包含openID的json数据
        //一个是过期的问题 另外一个是 单点登录的问题 openid 基本上只能一个人登录吧 所以暂时不考虑单点的问题
        //现在是过期的问题  过期的场景是什么呢  是用户长时间没有用了。  需要重新登录 过期的时间不放在json里面，而是放在用户的 服务器端数据里
        //总之丢个token 给前端 前端靠这个token获取数据
        $token_data = [
            'openid' => $openid,
            'time'=>time(),  //生成的token要不一样
        ];
        $token = make_token($token_data);

        //在用户数据本身设置过期时间
        $data = [
            'user'=>$user,
            'expire_time'=>time() + 3600
        ];
        Cache::set( $openid, $data );

        $this->success($token);
    }

}